/**
 * 由于本工程为C语言开发环境，此代码使用cpp语法，故仅做汇总。
 * 运行调试使用Cpp_training工程。
 */

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

// 定义一个链表数据结构
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

// 初始化一个带头结点的链表
void initLinkListWithHeadPointer(LinkList &L) {
    L = (LinkList) malloc(sizeof (LNode));
    L->data = NULL;
    L->next = NULL;
}

// 头插法新建链表
LinkList createLinkListByHead(LinkList &L) {
    // 定义一个结构体指针，指向新结点
    LinkList s;
    ElemType e;
    scanf("%d", &e);
    while (e != 9999) {
        // 申请一个新的空间存放新结点
        s = (LinkList) malloc(sizeof (LNode));
        s->data = e;
        s->next = L->next;
        L->next = s;
        scanf("%d", &e);
    }
    return L;
}

// 尾插法新建链表
LinkList createLinkListByTail(LinkList &L) {
    // r指向链表表尾
    LinkList s, r = L;
    ElemType e;
    scanf("%d", &e);
    while (e != 9999) {
        s = (LinkList) malloc(sizeof (LNode));
        s->data = e;
        s->next = NULL;
        r->next = s;
        r = s;
        scanf("%d", &e);
    }
    return L;
}

// 从头指针开始遍历链表
void printLinkListFromHead(LinkList L) {
    // 取第一个元素
    L = L->next;
    while (L != NULL) {
        printf("%d", L->data);
        L = L->next;
        if (L != NULL) {
            printf(" ");
        }
    }
    printf("\n");
}

/**
 * 输入3 4 5 6 7 9999一串整数，9999代表结束，通过头插法新建链表，并输出，通过尾插法新建链表并输出。
 * 注意输出要采用如下代码（因为OJ判题对空格敏感，因此需要用下面的打印代码来做）：
 *          //打印链表中每个结点的值
 *          void PrintList(LinkList L) {
 *              L=L->next;
 *              while(L!=NULL) {
 *                  printf("%d",L->data);	//打印当前结点数据
 *                  L=L->next;				//指向下一个结点
 *                  if(L!=NULL) {
 *                      printf(" ");
 *                  }
 *              }
 *              printf("\n");
 *          }
 *
 * @return
 */
int main() {
    // 定义带头结点带链表，并初始化
    LinkList L1, L2;
    initLinkListWithHeadPointer(L1);
    initLinkListWithHeadPointer(L2);
    // 头插法新建链表，并遍历打印
    createLinkListByHead(L1);
    printLinkListFromHead(L1);
    // 尾插法新建链表，并遍历打印
    createLinkListByTail(L2);
    printLinkListFromHead(L2);

    return 0;
}